package com.pdfbox.sample.md2pdf;

import com.lowagie.text.pdf.PdfAction;
import com.lowagie.text.pdf.PdfOutline;
import com.lowagie.text.pdf.PdfWriter;
import org.commonmark.node.AbstractVisitor;
import org.commonmark.node.Heading;
import org.commonmark.node.Node;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.html.HtmlRenderer;
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.xhtmlrenderer.pdf.PDFCreationListener;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 注意点
 * 实现通过书签实现了目录功能
 * 实现了中文支持，通过 css 控制的
 */
public class Md2PdfDemo1 {

    public static void main(String[] args) {
        String markdown = Md2PdfDemo1.DEMO;
        String pdfPath = "E:/PdfBox_Examples/md2Pdf.pdf";
        try {
            String html = md2Html(markdown);
            System.out.println("html = " + html);
            // 包装为 XHTML（Flying-Saucer 要求）
            String xhtml = wrapAsXhtml(html);
            html2Pdf(xhtml, pdfPath);

            System.out.println("markdown 2 pdf " + pdfPath + " success");
        } catch (Exception e){
            System.out.println("main error");
            e.printStackTrace();
        }
    }

    public static String md2Html(String markdown){
        Parser parser = Parser.builder().build();

        HtmlRenderer renderer = HtmlRenderer.builder()
                .build();
        Node document = parser.parse(markdown);

        return renderer.render(document);
    }

    public static void html2Pdf(String html, String pdfPath) throws IOException {
        ITextRenderer renderer = new ITextRenderer();
        // 关键：注册中文字体
        String fontPath = "C:/Windows/Fonts/simsun.ttc"; // Windows系统宋体路径
        // 或者使用资源文件夹中的字体（需将字体文件放入resources/fonts）
        renderer.getFontResolver().addFont(fontPath, "Identity-H", true);
        // 监听布局过程，记录锚点位置
        renderer.setListener(new PDFCreationListener() {

            @Override
            public void preOpen(ITextRenderer iTextRenderer) {

            }

            @Override
            public void preWrite(ITextRenderer renderer, int pageCount) {
                // 2. 获取 ITextUserAgent（内部可能存储了锚点信息）
                // 注意：新版可能不直接暴露锚点，需手动解析 DOM
                // 这里只是示例，实际可能需要更复杂的解析
                System.out.println("PDF 即将写入，当前页数: " + pageCount);
            }

            @Override
            public void onClose(ITextRenderer renderer) {
                PdfWriter writer = renderer.getWriter();
                if (writer != null) {
                    // 获取根大纲（书签）
                    PdfOutline rootOutline = writer.getRootOutline();

                    // 添加一个书签（跳转到第1页）  通过书签实现目录功能
                    PdfAction action = PdfAction.gotoLocalPage("1", false); // false = 不跳转新窗口
                    new PdfOutline(rootOutline, action, "我的书签");
                }
            }
        });

        renderer.setDocumentFromString(html);
        renderer.layout();
        try (FileOutputStream os = new FileOutputStream(pdfPath)){
            renderer.createPDF(os);
        } catch (Exception e) {
            System.out.println("html2Pdf error");
            e.printStackTrace();
        }
    }

    // 包装为 XHTML（添加 XML 声明、根元素等）
    public static String wrapAsXhtml(String htmlBody) {
        return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" +
                "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" +
                "<head>\n" +
                "    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n" +
                "    <title>中文PDF</title>\n" +
                "    <style>\n" +
                "        body { font-family: SimSun; }\n" +  // 指定中文字体
                "        h1 { color: #2c3e50; }\n" +
                "        pre { background: #f8f8f8; padding: 10px; }\n" +
                "    </style>\n" +
                "</head>\n" +
                "<body>\n" + htmlBody + "\n</body>\n</html>";
    }

    public static String SAMP_MD = "# Hello\n\n" +
            "This is a **Markdown** document.\n\n" +
            "- Item 1\n- Item 2\n\n" +
            "```java\nSystem.out.println(\"Code\");\n```";

    public static String DEMO = "# 示例文档 - 目录测试\n" +
            "\n" +
            "## 目录\n" +
            "1. [简介](#简介)\n" +
            "2. [功能特性](#功能特性)\n" +
            "3. [代码示例](#代码示例)\n" +
            "4. [表格示例](#表格示例)\n" +
            "5. [总结](#总结)\n" +
            "\n" +
            "---\n" +
            "\n" +
            "## 简介\n" +
            "这是一个 **Markdown 转 PDF** 的测试文档，用于验证目录、格式和样式是否正常渲染。\n" +
            "\n" +
            "## 功能特性\n" +
            "- ✅ 支持标题层级（H1/H2/H3）\n" +
            "- ✅ 自动生成目录（需 PDF 工具支持）\n" +
            "- ✅ **粗体**、*斜体*、`行内代码`\n" +
            "- ✅ 列表（有序/无序）\n" +
            "- ✅ 代码块高亮（需语言标注）\n" +
            "\n" +
            "## 代码示例\n" +
            "```java\n" +
            "public class HelloWorld {\n" +
            "    public static void main(String[] args) {\n" +
            "        System.out.println(\"Hello, PDF!\"); \n" +
            "    }\n" +
            "}\n" +
            "```\n" +
            "\n" +
            "## 表格示例\n" +
            "| 字段名 | 类型   | 说明          |\n" +
            "|--------|--------|---------------|\n" +
            "| id     | int    | 主键          |\n" +
            "| name   | string | 用户名        |\n" +
            "| status | boolean| 是否启用      |\n" +
            "\n" +
            "## 总结\n" +
            "- 目录需依赖 PDF 工具链支持（如 Flying-Saucer 不直接支持，需手动生成）。\n" +
            "- 复杂样式建议内联 CSS。";

}
